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                  

猜你喜欢

转载自blog.csdn.net/x603560617/article/details/83376584