给定两个已经排好序的链表,将它们合并成为一个新的链表,例如链表a为1->2->4,链表b为1->3->4,合并后为1->1->2->3->4->4。
因为两个链表都是各自已经排好序的,姑且认为从小到大的顺序。该问题比较容易解决,我们可以先考虑特殊情况,例如如果其中一个链表为空,则直接返回另一个链表;然后,我们先比较两个链表的第一个元素,取较小的元素为新的链表的起始指针;再对两个链表各自定义一个位置指针,将两个链表当前位置指针的值进行比较,取较小的指针作为新链表的下一个元素,并且更新原链表的指针位置;最后,当某个链表的位置指针为空时,则表明拼接结束。C++程序如下,我们默认已经定义好了ListNode结构体,结构体包含整形变量val以及同类型的结构体指针next,整个程序运行耗时8ms。
/**
 * 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* tmpNode1=l1;
        ListNode* tmpNode2=l2;
        ListNode* firstNode;
        ListNode* currentNode;
        if(l1 == NULL)
            return l2;
        else if(l2==NULL)
            return l1;
        if((tmpNode1->val)<(tmpNode2->val)){
            firstNode=l1;
            tmpNode1=tmpNode1->next;
            firstNode->next=l2;
        }
        else{
            firstNode=l2;
            tmpNode2=tmpNode2->next;
            firstNode->next=l1;
        }
        currentNode = firstNode;
        
        while(tmpNode1!=NULL && tmpNode2!=NULL){
            if((tmpNode1->val) < (tmpNode2->val)){
                currentNode->next = tmpNode1;
                tmpNode1 = tmpNode1->next;
                currentNode = currentNode->next;
                currentNode->next = tmpNode2;
            }
            else{
                currentNode->next = tmpNode2;
                tmpNode2 = tmpNode2->next;
                currentNode = currentNode->next;
                currentNode->next = tmpNode1;
            }
        }
        return firstNode;
    }
}; 
   往期推送:
[DLdigest-20] 不同场景下的中文汉字转阿拉伯数字
[DLdigest-19] 不同场景下文本中的阿拉伯数字转中文汉字