链表刷题这一篇就够了~

4.4
技巧:使用虚拟节点prev可以避免处理空指针的情况,降低代码的复杂性

21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)

思路:将小的节点和prev相连

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode prev=new ListNode(-1);
        ListNode cur=prev;
        while(list1!=null&&list2!=null){
            if(list1.val<list2.val){
                cur.next=list1;
                list1=list1.next;
            }else{
                cur.next=list2;
                list2=list2.next;
            }
            cur=cur.next;
        }
        if(list1==null){
            cur.next=list2;
        }
        if(list2==null){
            cur.next=list1;
        }
        return prev.next;
    }

 23. 合并K个升序链表 - 力扣(LeetCode) (leetcode-cn.com)

 思路:利用堆将小的节点筛选出来和prev相连

 public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length==0){
            return null;
        }
        ListNode prev=new ListNode(-1);
        ListNode cur=prev;
        PriorityQueue<ListNode>queue=new PriorityQueue<>((o1,o2)->(o1.val-o2.val));
        for(ListNode head:lists){
            if(head!=null){
                queue.add(head);
            }
        }
        while(!queue.isEmpty()){
            ListNode node=queue.poll();
            cur.next=node;
            cur=cur.next;
            if(node.next!=null){
                queue.add(node.next);
            }
        }
        return prev.next;
    }

优先队列 queue中的元素个数最多是 k,所以一次 poll 或者 add 方法的时间复杂度是 O(logk);

所有的链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现奇偶链表的代码和注释: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct ListNode { int val; struct ListNode *next; } ListNode; // 创建链表函数,返回链表头指针 ListNode* createList() { ListNode *head = (ListNode*)malloc(sizeof(ListNode)); // 创建头节点 head->next = NULL; // 头节点的next指针指向NULL ListNode *tail = head; // 定义尾指针,初始指向头节点 int data; scanf("%d", &data); while (data != -1) { // 输入-1表示链表输入结束 ListNode *cur = (ListNode*)malloc(sizeof(ListNode)); // 创建新节点 cur->val = data; // 新节点的值为输入的值 cur->next = NULL; // 新节点的next指针指向NULL tail->next = cur; // 尾指针的next指针指向新节点 tail = cur; // 尾指针指向新节点 scanf("%d", &data); } return head; // 返回头指针 } // 分离奇偶链表函数,返回新链表头指针 ListNode* oddEvenList(ListNode* head) { if (head == NULL || head->next == NULL) { // 如果链表为空或只有一个节点,直接返回原链表头指针 return head; } ListNode *odd = head; // 定义奇数节点指针,初始指向头节点 ListNode *even = head->next; // 定义偶数节点指针,初始指向第二个节点 ListNode *evenHead = even; // 定义偶数链表头指针,初始指向第二个节点 while (even != NULL && even->next != NULL) { // 遍历链表,将奇数节点和偶数节点分别连接起来 odd->next = even->next; // 奇数节点的next指针指向下一个奇数节点 odd = odd->next; // 奇数节点指针指向下一个奇数节点 even->next = odd->next; // 偶数节点的next指针指向下一个偶数节点 even = even->next; // 偶数节点指针指向下一个偶数节点 } odd->next = evenHead; // 将奇数链表和偶数链表连接起来 return head; // 返回原链表头指针 } int main() { ListNode *head = createList(); // 创建链表 head = oddEvenList(head); // 分离奇偶链表 ListNode *cur = head->next; // 定义指针,指向第一个节点 while (cur != NULL) { // 遍历链表,输出每个节点的值 printf("%d ", cur->val); cur = cur->next; } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值