LeetCode 21.合并两个有序链表
思路:
创建一个头结点和一个尾节点,然后对两个链表的值进行比较,尾指针去找更小的值进行尾插,找到后链接起来,然后该链表走到下一个结点。依次比较遍历直到有一个链表结束。如果另一个链表还没有结束,那么尾指针的next直接指向该链表完成尾插。
代码:
c
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
struct ListNode* head = NULL,*tail = NULL;
if(list1 == NULL) //判断是否为空,如果为空就不需要合并,直接传另一个链表
return list2;
if(list2 == NULL)
return list1;
while(list1 && list2) //结束的条件
{
if(list1->val < list2->val) //大小比较,谁小进谁的链表
{
if(tail == NULL) //第一次进入要先找到第一个结点
{
head = tail = list1;
}
else
{
tail->next = list1;
tail = tail->next;
}
list1 = list1->next;
}
else //list2->val小于list1->val的情况
{
if(tail == NULL)
{
head = tail = list2;
}
else
{
tail->next = list2;
tail = tail->next;
}
list2 = list2->next;
}
}
if(list1) //谁没结束就链接谁
tail->next = list1;
if(list2)
tail->next = list2;
return head;
}