21. Merge Two Sorted Lists | 连接两个有序单链表

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.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
  public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
		if (l1 == null) {
			return l2;
		}
		if (l2 == null) {
			return l1;
		}

		if (l1.val < l2.val) {
			l1.next = mergeTwoLists(l1.next, l2);
		} else {
			l2.next = mergeTwoLists(l1, l2.next);
		}
		return l1.val < l2.val ? l1 : l2;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您解答这个问题。以下是一个用C语言编写的将两个有序单链表合并成一个有序单链表的程序: ```c #include <stdio.h> #include <stdlib.h> struct ListNode { int val; struct ListNode *next; }; struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode)); dummy->next = NULL; struct ListNode* tail = dummy; while (l1 && l2) { if (l1->val < l2->val) { tail->next = l1; l1 = l1->next; } else { tail->next = l2; l2 = l2->next; } tail = tail->next; } if (l1) { tail->next = l1; } else { tail->next = l2; } return dummy->next; } int main() { // create two sorted linked lists struct ListNode* l1 = (struct ListNode*)malloc(sizeof(struct ListNode)); l1->val = 1; l1->next = (struct ListNode*)malloc(sizeof(struct ListNode)); l1->next->val = 2; l1->next->next = (struct ListNode*)malloc(sizeof(struct ListNode)); l1->next->next->val = 4; l1->next->next->next = NULL; struct ListNode* l2 = (struct ListNode*)malloc(sizeof(struct ListNode)); l2->val = 1; l2->next = (struct ListNode*)malloc(sizeof(struct ListNode)); l2->next->val = 3; l2->next->next = (struct ListNode*)malloc(sizeof(struct ListNode)); l2->next->next->val = 4; l2->next->next->next = NULL; // merge two linked lists struct ListNode* mergedList = mergeTwoLists(l1, l2); // print the merged linked list printf("Merged Linked List:\n"); while (mergedList) { printf("%d ", mergedList->val); mergedList = mergedList->next; } printf("\n"); return 0; } ``` 这个程序的思路是先创建一个虚拟节点dummy,然后用tail指向dummy作为合并后链表的尾节点,再使用l1和l2指向两个要合并的单链表的头节点。然后遍历两个单链表,如果l1的当前节点的值小于l2的当前节点的值,则把l1的当前节点加到合并后链表的尾部,并且让l1的指针指向下一个节点;否则把l2的当前节点加到合并后链表的尾部,并且让l2的指针指向下一个节点。不断重复以上过程,直到l1或l2为空。最后如果l1不为空,则让合并后链表的尾部指向l1;否则让合并后链表的尾部指向l2。最后返回dummy的next即为合并后链表的头节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值