合并两个有序的单链表,合并之后的链表依然有序: 这道题经常被各公司考察。 例如: 链表1: 1->2->3->4 链表2: 2->3->4->5 合并后: 1->2->2->3->3->4->4->5 解题思路: 挨着比较链表1和链表2。 这个类似于归并排序。尤其要注意两个链表都为空、和其中一个为空的情况。只需要O (1) 的空间。时间复杂度为O (max(len1,len2)) public Node mergeLinkList(Node head1, Node head2) {if (head1 == null && head2 == null) {...
题目82. 删除排序链表中的重复元素 II:题解:
看错题:删除多余的重复节点
emmm...记住了题目在路上想的,结果记错了,实现了删除多余的重复节点的功能,如下虽然但是,把代码还是放一下吧
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) :...
从尾部到头部打印链表,由于递归,比较简单,所以方法1,使用递归,#include<stdio.h>
#include<stdlib.h>
struct LinkNode{int data;struct LinkNode* next;
};struct LinkNode* createList(){int len = 0 ;printf("input list len\n");scanf("%d",&len); printf("input list elements\n");struct LinkNode* head = (LinkNode*)malloc(sizeof(LinkNode*));if (head == NULL ){printf("head is empty\n");return NULL;}struct Lin...
#include<stdio.h>
#include<stdlib.h>
#define N 9
typedef struct node{
int data;
struct node * next;
}ElemSN;
ElemSN * Createlink(int a[],int n)
{ int i;
ElemSN * h=NULL, * p;
for( i=N-1;i>=0;i--) {
p=(ElemSN *)malloc(sizeof(ElemSN)); p->data =a[i]; p->next=h; h=p; } return h;
}ElemSN* In_reverseList(ElemSN* H)
{ ElemSN * newHead ;
if (H == NULL || H->next == NUL...
题目描述
反转一个单链表。
示例:输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
迭代
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode n...
一.单链表
单链表: 在逻辑上是连续的,在物理存储上是不连续的(每一个数据元素都占一个单独
的位置), 只能够从头到尾遍历。1、单链表的结构申明typedef int ElemType;
typedef struct Node
{ElemType data; // 元素struct Node *next; // 下一个结点的地址
}SNode, *LinkList; 12、带头结点的单链表? 1 typedef int ElemType;2 typedef struct Node3 {4 union5 {6 int length;7 ElemType data;8 };9 struct Node *next; ...
题目描述 有 \(n\) 个物品,每个物品有两个属性:权值 \(v\) 和大小 \(s\)。 你要选出 \(m\) 个物品,使得你选出的物品的权值的和的 \(d_v\) 减掉大小的极差的 \(d_s\) 次方最大。\(n\leq 200000,m\leq 50,1\leq d_v,d_s\leq 2\)题解 如果选的物品的数量不到 \(m\) 个,且不连续,那么一定不是最优的。 因为如果不是连续的,那么可以多选一个大小在这些物品之间的物品,使答案更优。 如果选了 \(m\) 个物品,那么可...
这题有两种思考方式,一种是添加辅助空间,先进后出,当然是栈了,做法就是遍历链表,将值压入栈中,然后再一次弹出。还有一种方法是链表反序,链表反序也有两种方法。一种是将链表在原有的基础上更改指针,进行反序。光看代码可能不太还理解,我们可以看一下执行过程。假设p1->p2->p3->p4->p5->p5->.......那么执行一次为p1<-p2->p3->p4->p5.......然后p1=p2;p2=p3;将其更新为新的p1->p2->p3->p4....循环执行,直到p1->p2->p3.......
/*** 单向环形链表应用 -- 约瑟夫环* Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,* 数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,* 由此产生一个出队编号的序列。*/
public class Josepfu {public static void main(String[] args){CircleSingleLinkedList linkedList = new CircleSingleLinkedList();linkedList.add(5)...
具体分析可见http://blog.csdn.net/libin1105/article/details/48267113需要指出的是,上述博客中2*(a+b)=a+b+c+b应该改为2*(a+b)=a+b+(c+b)*n,其中n为自然数。然后得到关系式a=(b+c)*n-b由此可见两个指针会相遇在环的入口。 1class Solution {2public:3 ListNode* EntryNodeOfLoop(ListNode* pHead)4 {5if(pHead==NULL||pHead->next==NULL)6return NULL;7 ListNode* one=pHead;8 ListNode* two=pHead;9do...
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例 1:
输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9. 示例 2:
输入:head = [4,5,1,9], node = 1 输出:[4,5,9] 解释:给定你链表中值为 1 的第三个节点,那么在调用了...
86. 分隔链表https://leetcode-cn.com/problems/partition-list/难度完成日期耗时提交次数中等2020-1-160.5小时1问题描述给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5解题思路普通方法ListNode* partition(ListNode* head, int x) {ListNode *former = new Li...
题目链接:合并K个排序链表题意:合并k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。题解:这题的前身是合并两个排序链表。在剑指里有写。可以点击链接查看。。这个题,最好就是用小顶堆,O(nlog(K))。用c++的优先队列可以解决这个小顶堆。把每个节点丢进优先队列,然后以出队列的顺序作为新链表顺序代码: 1/**2 * Definition for singly-linked list.3 * struct ListNode {4 * int val;5 * ListNode *...
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.示例 2:输入:[1,2,3,4,5,6]输出:此...
原题给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5原题url:https://leetcode-cn.com/problems/partition-list/解题题目很好理解,重点在于区分大于等于和小于目标值的节点,判断其实是很简单的,主要在于如何拼接链表,以及最终如何返回。我发现,针对链表拼接...