合并两个有序链表

问题描述:

将两个升序链表合并为一个新的升序链表并返回,新链表是通过拼接给定的两个链表的所有结点组成的。(不能创建一个新的链表)

合并两个有序链表_第1张图片

思路:

从头开始,取两个链表中小的那个尾插到新链表,如果两个链表均为空,则返回空,若有一个为空,就返回另一个。

定义两个结构体指针head和tail,head用来存放第一个结点,tail用来将小的结点重新插入,开始先将二者均置为空,谁的第一个结点小就将head和tail等于谁的第一个结点,插入第一个节点之后,l1或l2等于下一个结点,之后再将tail的next等于下一个小的结点,tail指向这个小的节点,不断循环,直至l1或l2为空跳出循环,最后将tail的next指向不是空集的链表即可。

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2)
{
	if (1l == NULL)
		return l2;
	if (l2 == NULL)
		return l1;
	struct ListNode* head = NULL, * tail = NULL;
	while (l1 != NULL && l2 != NULL)
	{
		if (l1->data < l2->data)
		{
			//尾插
			if (tail == NULL)
				head =tail = l1;
			else
			{
				tail->next = l1;
				tail = tail->next;
			}
			l1 = l1->next;
		}
		else
		{
			if (tail == NULL)
				head = tail = l2;
			else
			{
				tail->next = l2;
				tail = tail->next;
			}
			l2 = l2->next;
		}
	}
	if (l1)
		tail->next = l1;
	if (l2)
		tail->next = l2;
	return head;
}

你可能感兴趣的:(链表,数据结构)