leetcode 21. Merge Two Sorted Lists(C语言,合并两个排序的链表为一个排序链表)32

贴原题:

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

解析:
  题目意思在标题就说明了,合并两个排序的链表为一个排序链表,这种题也是数据结构里的基础题目。
  我的思路是声明出两个链表指针,一个指向要返回的链表头结点,另一个(p)用来在要返回的链表上移动,即指向链表最后一个元素,用这个指针链接每个元素。然后顺序比较l1和l2的元素大小,那个大则p就指向该元素,并移位。

贴代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    if(!l1)//第一个链表为空,则直接返回第二个链表
    {
        return l2;
    }
    if(!l2)//第二个链表为空则返回第一个
    {
        return l1;
    }
    struct ListNode *p, *list;
    if(l1->val <= l2->val)//比较l1和l2头结点
    {
        p = l1;
        l1 = l1->next;
    }
    else
    {
        p = l2;
        l2 = l2->next;
    }
    list = p;//使list指向头结点
    while(l1 && l2)//其中一个链表插入完则跳出循环
    {
        if(l1->val < l2->val)
        {
            p->next = l1;
            l1 = l1->next;//指向下一个元素
        }
        else
        {
            p->next = l2;
            l2 = l2->next;
        }
        p->next->next = NULL;//清空下下一个节点
        p = p->next;//移向新增加的节点
    }
    if(l1)//使p->next指向剩下未完结的链表的头结点
    {
        p->next = l1;
    }
    else if(l2)
    {
        p->next = l2;
    }
    return list;
}

你可能感兴趣的:(每日一题leetcode)