1. 程式人生 > >LeetCode演算法題21:合併兩個有序連結串列解析

LeetCode演算法題21:合併兩個有序連結串列解析

將兩個有序連結串列合併為一個新的有序連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

因為之前做過兩數之和的那道題,所以一開始並沒有審清楚題,這個題的後一句提示很重要,是直接拼接兩個連結串列的所有節點,也就是說其實不需要建立新的連結串列,只需要對這兩個連結串列進行排序即可。所以思路就是重新對連結串列的next進行排序即可,這裡同樣可以使用一個啞節點來開頭,然後只需要返回啞節點的下一個節點就可以。對兩個連結串列都不為空的情況比較其值大小,然後將節點指向小的節點,然後小節點指向下一個節點。如果有一個表空了,那就直接將下一個節點指向非空連結串列的當前節點。
C++原始碼:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode * l3 = new ListNode(0);
        //ListNode l3(0);
ListNode * curr = l3; while(l1!=NULL&&l2!=NULL) { if(l1->val>l2->val) { curr->next = l2; l2 = l2->next; } else { curr->next = l1; l1 =
l1->next; } curr = curr->next; } if (l1!=NULL) curr->next = l1; if (l2!=NULL) curr->next = l2; return l3->next; } };

python3原始碼:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        l3 = ListNode(0)
        p, q, curr = l1, l2, l3
        while p!=None and q!=None:
            if p.val > q.val:
                curr.next = q
                q = q.next
            else:
                curr.next = p
                p = p.next
            curr = curr.next
        if p != None:
            curr.next = p
        if q != None:
            curr.next = q
        return l3.next