LeetCode第二十一题(合并两个有序链表)

135 阅读2分钟

归并算法(Java)

核心思想: 根据两个有序链表list1和list2的结点值的大小来判断先把哪一个结点合并到总链表resList(升序链表先合并较小值的结点),直至两个有序链表的其中一个链表的所有结点合并完成,最后将有剩余结点未合并的链表直接合并到总链表的尾部即可。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode resList = new ListNode(0, null);//合并后的链表
        ListNode rear = resList;//尾插法建链表
        ListNode temp = resList;//临时指针
        while(list1 != null && list2 != null){
            if(list1.val < list2.val){//若list1的结点值比list2的结点值小,则合并list1的结点
                temp = list1.next;
                list1.next = rear.next;
                rear.next = list1;
                list1 = temp;
            }
            else{//否则,合并list2的结点
                temp = list2.next;
                list2.next = rear.next;
                rear.next = list2;
                list2 = temp;
            }
            rear = rear.next;//rear指向resList的尾结点
        }
        if(list1 != null)//list1有剩余结点
            rear.next = list1;
        if(list2 != null)
            rear.next = list2;//list2有剩余结点
        return resList.next;
    }
}

递归(Java)

核心思想: 这个太强了!!!递归函数的终止条件为两个有序链表list1和list2的其中一个链表为空,即两个有序链表的其中一个链表的所有结点合并完成,否则就是两个有序链表中较小值的结点和较小值结点所在链表的剩余结点与另一链表的所有结点合并的结果进行合并,为合并后的总链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1 == null)//list1合并完成
            return list2;
        else if(list2 == null)//list2合并完成
            return list1;
        else if(list1.val < list2.val){//list1的结点值比list2的结点值小
            //较小值的结点和较小值结点所在链表list1的剩余结点与另一链表list2的所有结点合并的结果进行合并
            list1.next = mergeTwoLists(list1.next, list2);
            return list1;
        }
        else{
            //较小值的结点和较小值结点所在链表list2的剩余结点与另一链表list1的所有结点合并的结果进行合并
            list2.next = mergeTwoLists(list2.next, list1);
            return list2;
        }
    }
}