726 字
4 分钟
LeetCode刷题(排序链表,相交链表)

排序链表#

题目描述#

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

示例 1:

172

输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

173

输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

输入:head = []
输出:[]

题解#

递归 + 选择排序

递归终止条件为输入的节点为空或者节点后没有新的节点

用一个节点存储节点后的排序结果,让head节点插入其中

class Solution {
    public ListNode sortList(ListNode head) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode sortedList = sortList(head.next);
        if(head.val < sortedList.val) {
            head.next = sortedList;
            return head;
        }
        ListNode p = sortedList;
        while(p.next != null && head.val > p.next.val) {
            p = p.next;
        }
        head.next = p.next;
        p.next = head;
        return sortedList;
    }
}

相交链表#

题目描述#

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交**:

174

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

自定义评测:

评测系统 的输入如下(你设计的程序 不适用 此输入):

  • intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0
  • listA - 第一个链表
  • listB - 第二个链表
  • skipA - 在 listA 中(从头节点开始)跳到交叉节点的节点数
  • skipB - 在 listB 中(从头节点开始)跳到交叉节点的节点数

评测系统将根据这些输入创建链式数据结构,并将两个头节点 headAheadB 传递给你的程序。如果程序能够正确返回相交节点,那么你的解决方案将被 视作正确答案

题解#

在LeetCode解法上找到的一种直观方便的方法,很厉害啊

如果两个链表相交,那么相交点之后的长度是相同的

我们需要做的事情是,让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短链表的头结点位置。 为此,我们必须消除两个链表的长度差

指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历 如果 pA 到了末尾,则 pA = headB 继续遍历 如果 pB 到了末尾,则 pB = headA 继续遍历 比较长的链表指针指向较短链表head时,长度差就消除了 如此,只需要将最短链表遍历两次即可找到位置

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null || headB == null) {
            return null;
        }
        ListNode p1 = headA;
        ListNode p2 = headB;
        while(p1 != p2) {
            p1 = p1 == null ? headB : p1.next;
            p2 = p2 == null ? headA : p2.next;
        }
        return p1;
    }
}
LeetCode刷题(排序链表,相交链表)
https://thrinisty.github.io/Blog/posts/leetcode刷题排序链表相交链表/
作者
Thrinisty
发布于
2025-06-01
许可协议
CC BY-NC-SA 4.0